home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2004 April
/
Gamestar_61_2004-04_dvdb.iso
/
DVDStar
/
Editace
/
hltp.exe
/
{app}
/
Source Code
/
Zoners Half-Life Tools
/
hlrad
/
nomatrix.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2002-12-09
|
4KB
|
128 lines
#include "qrad.h"
// =====================================================================================
// CheckVisBit
// =====================================================================================
#ifdef HLRAD_HULLU
static bool CheckVisBitNoVismatrix(unsigned patchnum1, unsigned patchnum2, vec3_t &transparency_out)
#else
static bool CheckVisBitNoVismatrix(unsigned patchnum1, unsigned patchnum2)
#endif
{
#ifdef HLRAD_HULLU
// This fix was in vismatrix and sparse methods but not in nomatrix
// Without this nomatrix causes SwapTransfers output lots of errors
if (patchnum1 > patchnum2)
{
const unsigned a = patchnum1;
const unsigned b = patchnum2;
patchnum1 = b;
patchnum2 = a;
}
if (patchnum1 > g_num_patches)
{
Warning("in CheckVisBit(), patchnum1 > num_patches");
}
if (patchnum2 > g_num_patches)
{
Warning("in CheckVisBit(), patchnum2 > num_patches");
}
#endif
patch_t* patch = &g_patches[patchnum1];
patch_t* patch2 = &g_patches[patchnum2];
#ifdef HLRAD_HULLU
VectorFill(transparency_out, 1.0);
#endif
// if emitter is behind that face plane, skip all patches
if (patch2)
{
const dplane_t* plane2 = getPlaneFromFaceNumber(patch2->faceNumber);
if (DotProduct(patch->origin, plane2->normal) > (PatchPlaneDist(patch2) + MINIMUM_PATCH_DISTANCE))
{
// we need to do a real test
const dplane_t* plane = getPlaneFromFaceNumber(patch->faceNumber);
#ifdef HLRAD_HULLU
vec3_t transparency = {1.0,1.0,1.0};
#endif
// check vis between patch and patch2
// if v2 is not behind light plane
// && v2 is visible from v1
if (
(DotProduct(patch2->origin, plane->normal) > (PatchPlaneDist(patch) + MINIMUM_PATCH_DISTANCE))
&& (TestLine_r(0, patch->origin, patch2->origin) == CONTENTS_EMPTY)
#ifdef HLRAD_HULLU
&& (!TestSegmentAgainstOpaqueList(patch->origin, patch2->origin, transparency)))
#else
&& (!TestSegmentAgainstOpaqueList(patch->origin, patch2->origin)))
#endif
{
#ifdef HLRAD_HULLU
if(g_customshadow_with_bouncelight)
{
VectorCopy(transparency, transparency_out);
}
#endif
return true;
}
}
}
return false;
}
//
// end old vismat.c
////////////////////////////
void MakeScalesNoVismatrix()
{
char transferfile[_MAX_PATH];
hlassume(g_num_patches < MAX_PATCHES, assume_MAX_PATCHES);
safe_strncpy(transferfile, g_source, _MAX_PATH);
StripExtension(transferfile);
DefaultExtension(transferfile, ".inc");
if (!g_incremental || !readtransfers(transferfile, g_num_patches))
{
g_CheckVisBit = CheckVisBitNoVismatrix;
#ifndef HLRAD_HULLU
NamedRunThreadsOn(g_num_patches, g_estimate, MakeScales);
#else
if(g_rgb_transfers)
{NamedRunThreadsOn(g_num_patches, g_estimate, MakeRGBScales);}
else
{NamedRunThreadsOn(g_num_patches, g_estimate, MakeScales);}
#endif
// invert the transfers for gather vs scatter
#ifndef HLRAD_HULLU
NamedRunThreadsOnIndividual(g_num_patches, g_estimate, SwapTransfers);
#else
if(g_rgb_transfers)
{NamedRunThreadsOnIndividual(g_num_patches, g_estimate, SwapRGBTransfers);}
else
{NamedRunThreadsOnIndividual(g_num_patches, g_estimate, SwapTransfers);}
#endif
if (g_incremental)
{
writetransfers(transferfile, g_num_patches);
}
else
{
unlink(transferfile);
}
DumpTransfersMemoryUsage();
}
}